package com.example.tbplus14.Test;

import lombok.SneakyThrows;
import org.springframework.scheduling.annotation.Async;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class OpsClassLoader extends ClassLoader{

    // 接收到的class文件本地的存储位置
    private String rootDirPath;

    // 构造器
    public OpsClassLoader(String rootDirPath) {
        this.rootDirPath = rootDirPath;
    }
@Async
    // 读取Class字节流并解密的方法
    private byte[] getClassDePass(String className) throws IOException {
        String classpath = rootDirPath + className;

        // 模拟文件读取过程.....
        FileInputStream fis = new FileInputStream(classpath);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int bufferSize = 1024;
        int n = 0;
        byte[] buffer = new byte[bufferSize];
        while ((n = fis.read(buffer)) != -1)
            // 模拟数据解密过程.....
            baos.write(buffer, 0, n);
        byte[] data = baos.toByteArray();

        // 模拟保存解密后的数据....
        return data;
    }

    // 重写了父类的findClass方法
//    @SneakyThrows
//    @Override
//    protected Class<?> findClass(String name) throws ClassNotFoundException {
//        // 读取指定的class文件
//        byte[] classData = getClassDePass(name);
//        // 如果没读取到数据，抛出类不存在的异常
//        if (classData == null)
//            throw new ClassNotFoundException();
//        // 通过调用defineClass方法生成Class对象
//        return defineClass(name,classData,0,classData.length);
//    }


}
